package orders

import (
	_ "app/api/schema"
	"app/common"
	rich_err "app/error"
	_ "app/models"
	"app/service/orders"
	"app/utils"
	"fmt"

	mapset "github.com/deckarep/golang-set/v2"

	"strconv"
	"strings"

	"github.com/gin-gonic/gin"
)

func Init(group *gin.RouterGroup) {
	Gets(group)
	Get(group)
	Create(group)
	Update(group)
	Delete(group)
	AlertList(group)
}

// @Summary 获取订单列表
// @Tags orders
// @Produce json
// @param filter_status query []integer false "额外需要筛选的订单状态" collectionFormat(multi)
// @param greenhouse_id query integer false "筛选分配到指定大棚的订单" minimum(1)
// @Description.markdown desc_common_page
// @param page_size query integer false "用于分页的每页最大元素数量" minimum(1)
// @param page_index query integer false "请求的页码" minimum(1)
// @param order query string false "需要排序的字段,如需倒序,字段名前面加 `-`"
// @Success 200 {object} schema.Response{data=[]models.OrdersDetail}
// @Failure 400,500 {object} schema.ResponseErr
// @Router /api/v1/orders [get]
func Gets(group *gin.RouterGroup) {
	group.GET("/", func(context *gin.Context) {
		data, pager, err := orders.Gets(context)
		utils.GinJSONPageWithRichErr(context, data, pager, err)
	})
}

// @Summary 获取需要提醒的订单列表
// @Tags orders
// @Produce json
// @param filter_status query []integer false "额外需要筛选的订单状态" collectionFormat(multi)
// @param greenhouse_id query integer false "筛选分配到指定大棚的订单的提醒" minimum(1)
// @Description.markdown desc_common_page
// @param page_size query integer false "用于分页的每页最大元素数量" minimum(1)
// @param page_index query integer false "请求的页码" minimum(1)
// @param order query string false "需要排序的字段,如需倒序,字段名前面加 `-`"
// @param alert_type query string true "需要提醒的类型: sowing 播种提醒, sowed 分苗提醒, payment 付款提醒" Enums(sowing, sowed, payment)
// @Success 200 {object} schema.Response{data=[]models.OrdersDetail}
// @Failure 400,500 {object} schema.ResponseErr
// @Router /api/v1/orders/alert-list [get]
func AlertList(group *gin.RouterGroup) {
	group.GET("/alert-list", func(context *gin.Context) {
		alertType := context.Query("alert_type")
		if !mapset.NewSet(common.ALERT_TYPES...).Contains(strings.ToLower(alertType)) {
			utils.GinJSONWithRichErr(context, nil, rich_err.NewError(rich_err.RequestInvalid, fmt.Errorf("alert_type invalid")))
			return
		}
		data, pager, err := orders.AlertList(context, strings.ToLower(alertType))
		utils.GinJSONPageWithRichErr(context, data, pager, err)
	})
}

// @Summary 获取指定订单信息
// @Tags orders
// @Produce json
// @Success 200 {object} schema.Response{data=models.OrdersDetail}
// @Failure 404,500 {object} schema.ResponseErr
// @Param id path string true "订单ID"
// @Router /api/v1/orders/{id} [get]
func Get(group *gin.RouterGroup) {
	group.GET("/:id", func(context *gin.Context) {
		id, err := strconv.Atoi(context.Param("id"))
		if err != nil {
			utils.GinJSONWithRichErr(context, nil, rich_err.NewError(rich_err.RequestInvalid, err))
			return
		}
		data, richErr := orders.Get(strconv.Itoa(id))
		utils.GinJSONWithRichErr(context, data, richErr)
	})
}

// @Summary 创建订单
// @Tags orders
// @Accept json
// @Produce json
// @Param req body models.OrdersCore true "订单核心信息"
// @Success 200 {object} schema.Response{data=models.OrdersDetail}
// @Failure 400,500 {object} schema.ResponseErr
// @Router /api/v1/orders [post]
func Create(group *gin.RouterGroup) {
	group.POST("/", func(context *gin.Context) {
		data, richErr := orders.Create(context)
		utils.GinJSONWithRichErr(context, data, richErr)
	})
}

// @Summary 修改订单
// @Tags orders
// @Accept json
// @Produce json
// @Param req body models.OrdersDelta true "订单修改信息"
// @Param id path string true "订单ID"
// @Success 200 {object} schema.Response{data=models.OrdersDetail}
// @Failure 400,500 {object} schema.ResponseErr
// @Router /api/v1/orders/{id} [patch]
func Update(group *gin.RouterGroup) {
	group.PATCH("/:id", func(context *gin.Context) {
		_, err := strconv.Atoi(context.Param("id"))
		if err != nil {
			utils.GinJSONWithRichErr(context, nil, rich_err.NewError(rich_err.RequestInvalid, err))
			return
		}
		data, richErr := orders.Update(context)
		utils.GinJSONWithRichErr(context, data, richErr)
	})
}

// @Summary 删除订单
// @Tags orders
// @Produce json
// @Param id path string true "订单ID"
// @Success 200 {object} schema.Response
// @Failure 400,500 {object} schema.ResponseErr
// @Router /api/v1/orders/{id} [delete]
func Delete(group *gin.RouterGroup) {
	group.DELETE("/:id", func(context *gin.Context) {
		_, err := strconv.Atoi(context.Param("id"))
		if err != nil {
			utils.GinJSONWithRichErr(context, nil, rich_err.NewError(rich_err.RequestInvalid, err))
			return
		}
		richErr := orders.Delete(context)
		utils.GinJSONWithRichErr(context, nil, richErr)
	})
}
